package com.engine.salary.service;

import com.engine.salary.entity.salaryacct.dto.SalaryAcctEmployeeCountDTO;
import com.engine.salary.entity.salaryacct.param.*;
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
import com.engine.salary.report.entity.param.SalaryStatisticsReportDataQueryParam;
import com.engine.salary.util.page.PageInfo;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * 薪资核算人员
 * <p>Copyright: Copyright (c) 2022</p>
 * <p>Company: 泛微软件</p>
 *
 * @author qiantao
 * @version 1.0
 **/
public interface SalaryAcctEmployeeService {

    /**
     * 根据薪资核算记录id统计薪资核算人员的数量
     *
     * @param salaryAcctRecordIds 薪资核算记录的id
     * @return
     */
    List<SalaryAcctEmployeeCountDTO> countBySalaryAcctRecordId(Collection<Long> salaryAcctRecordIds);

    /**
     * 根据主键id获取单个薪资核算人员
     *
     * @param id 主键id
     * @return
     */
    SalaryAcctEmployeePO getById(Long id);

    /**
     * 根据主键id查询薪资核算人员
     *
     * @param ids 主键id
     * @return
     */
    List<SalaryAcctEmployeePO> listByIds(Collection<Long> ids);

    /**
     * 根据薪资核算记录id查询薪资核算人员
     *
     * @param salaryAcctRecordId 薪资核算记录id
     * @return
     */
    List<SalaryAcctEmployeePO> listBySalaryAcctRecordId(Long salaryAcctRecordId);

    /**
     * 根据薪资核算记录id查询薪资核算人员
     *
     * @param salaryAcctRecordIds 薪资核算记录id
     * @return
     */
    List<SalaryAcctEmployeePO> listBySalaryAcctRecordIds(Collection<Long> salaryAcctRecordIds);

    /**
     * 根据薪资核算记录id、个税扣缴义务人id查询薪资核算人员
     *
     * @param salaryAcctRecordId 薪资核算记录id
     * @param taxAgentId         个税扣缴义务人id
     * @return
     */
    List<SalaryAcctEmployeePO> listBySalaryAcctRecordIdAndTaxAgentId(Long salaryAcctRecordId, Long taxAgentId);

    /**
     * 根据薪资核算记录id、主键id查询薪资核算人员
     *
     * @param salaryAcctRecordId 薪资核算记录id
     * @param ids                主键id
     * @return
     */
    List<SalaryAcctEmployeePO> listBySalaryAcctRecordIdAndIds(Long salaryAcctRecordId, Collection<Long> ids);

    /**
     * 根据薪资核算记录id、人员id查询薪资核算人员
     *
     * @param salaryAcctRecordId 薪资核算记录id
     * @param employeeIds        人员id
     * @return
     */
    List<SalaryAcctEmployeePO> listBySalaryAcctRecordIdAndEmployeeIds(Long salaryAcctRecordId, Collection<Long> employeeIds);

    /**
     * 根据薪资核算记录id、人员id查询薪资核算人员
     *
     * @param salaryAcctRecordIds 薪资核算记录id
     * @param employeeIds         人员id
     * @return
     */
    List<SalaryAcctEmployeePO> listBySalaryAcctRecordIdsAndEmployeeIds(Collection<Long> salaryAcctRecordIds, Collection<Long> employeeIds);

    /**
     * 根据薪资核算记录id、人员id、个税扣缴义务人id查询薪资核算人员
     *
     * @param salaryAcctRecordIds 薪资核算记录id
     * @param employeeId          人员id
     * @param taxAgentId          个税扣缴义务人
     * @return
     */
    List<SalaryAcctEmployeePO> listByRecordIdsAndEmpIdAndTaxAgentId(Collection<Long> salaryAcctRecordIds, Long employeeId, Long taxAgentId);

    /**
     * 根据列表查询条件查询薪资核算人员（分页）
     *
     * @param queryParam 列表查询条件
     * @return
     */
    PageInfo<SalaryAcctEmployeePO> listPageByParam(SalaryAcctEmployeeQueryParam queryParam);

    /**
     * 根据列表查询条件查询薪资核算人员
     *
     * @param queryParam 列表查询条件
     * @return
     */
    List<SalaryAcctEmployeePO> listByParam(SalaryAcctEmployeeQueryParam queryParam);

    /**
     * 根据薪资核算结果列表的列表查询条件查询薪资核算人员（分页）
     *
     * @param queryParam 薪资核算结果列表的列表查询条件
     * @return
     */
    PageInfo<SalaryAcctEmployeePO> listPageByResultQueryParam(SalaryAcctResultQueryParam queryParam);

    /**
     * 根据薪资核算结果列表的列表查询条件查询薪资核算人员
     *
     * @param queryParam 薪资核算结果列表的列表查询条件
     * @return
     */
    List<SalaryAcctEmployeePO> listByResultQueryParam(SalaryAcctResultQueryParam queryParam);

    /**
     * 根据列表查询条件查询同比减少的薪资核算人员（分页）
     *
     * @param queryParam 列表查询条件
     * @return
     */
    PageInfo<SalaryAcctEmployeePO> listPageByParam4Reduce(SalaryAcctEmployeeQueryParam queryParam);

    /**
     * 根据列表查询条件查询同比增加的薪资核算人员（分页）
     *
     * @param queryParam 列表查询条件
     * @return
     */
    PageInfo<SalaryAcctEmployeePO> listPageByParam4Add(SalaryAcctEmployeeQueryParam queryParam);

    /**
     * 根据列表查询条件查询同比减少的薪资核算人员
     *
     * @param queryParam 列表查询条件
     * @return
     */
    List<SalaryAcctEmployeePO> listByParam4Reduce(SalaryAcctEmployeeQueryParam queryParam);

    /**
     * 根据列表查询条件查询同比增加的薪资核算人员
     *
     * @param queryParam 列表查询条件
     * @return
     */
    List<SalaryAcctEmployeePO> listByParam4Add(SalaryAcctEmployeeQueryParam queryParam);

    /**
     * 根据列表查询条件查询合并计税的薪资核算人员（分页）
     *
     * @param queryParam 列表查询条件
     * @return
     */
    PageInfo<SalaryAcctEmployeePO> listPageByParam4ConsolidatedTax(SalaryAcctEmployeeQueryParam queryParam);

    /**
     * 根据列表查询条件查询合并计税的薪资核算人员
     *
     * @param queryParam 列表查询条件
     * @return
     */
    List<SalaryAcctEmployeePO> listByParam4ConsolidatedTax(SalaryAcctEmployeeQueryParam queryParam);

    /**
     * 添加薪资核算人员
     *
     * @param saveParam 保存参数
     */
    void save(SalaryAcctEmployeeSaveParam saveParam);

    /**
     * 从环比上月减少添加薪资核算人员
     *
     * @param param
     */
    void addFromReduce(SalaryAcctEmployeeAddParam param);

    /**
     * 批量保存
     *
     * @param salaryAcctEmployeePOS 薪资核算人员
     */
    void batchSave(Collection<SalaryAcctEmployeePO> salaryAcctEmployeePOS);

    /**
     * 薪资核算记录（会删除薪资核算结果、校验异常明细、线下对比导入结果）
     *
     * @param ids
     */
    void deleteByIds(Collection<Long> ids);

    /**
     * 根据参数删除薪资核算人员
     *
     * @param deleteParam 删除参数
     */
    void deleteByParam(SalaryAcctEmployeeDeleteParam deleteParam);

    /**
     * 根据薪资核算记录id删除薪资核算人员
     *
     * @param salaryAcctRecordIds 薪资核算记录id
     */
    void deleteBySalaryAcctRecordIds(Collection<Long> salaryAcctRecordIds);

    /**
     * 根据薪资核算记录id初始化薪资核算人员
     *
     * @param salaryAcctRecordPO 薪资核算记录
     */
    void initBySalaryAcctRecord(SalaryAcctRecordPO salaryAcctRecordPO);

    /**
     * 刷新薪资核算人员的个税扣缴义务人
     *
     * @param salaryAcctRecordId 薪资核算记录
     */
    void refresh(Long salaryAcctRecordId);


    List<SalaryAcctEmployeePO> listBySalaryStatisticsReportParam(SalaryStatisticsReportDataQueryParam param);

    /**
     * 根据个税扣缴义务人和薪资所属月获取列表
     *
     * @param taxAgentIds
     * @param salaryMonths
     * @return
     */
    List<SalaryAcctEmployeePO> listByTaxAgentAndSalaryMonth(List<Long> taxAgentIds, Set<Date> salaryMonths);
    List<SalaryAcctEmployeePO> listBySobAndSalaryMonth(List<Long> salarySobIds, Set<Date> salaryMonths);

    /**
     * 锁定人员
     * @param updateParam
     */
    void lockEmp(SalaryAcctResultUpdateLockStatusParam updateParam);

    /**
     * 更新
     * @param salaryAcctEmployeePO
     */
    void updateIgnoreNull(SalaryAcctEmployeePO salaryAcctEmployeePO);

    void lock(SalaryAcctEmployeePO salaryAcctEmployeePO);
}
